//
//  SPGameScene.h
//  shandong_porker
//
//  Created by Developer on 2025-01-08.
//  Copyright © 2025 ShandongPoker. All rights reserved.
//

#import "../../Core/Base/BaseSKScene.h"
#import "../../Models/Game/SPGameManager.h"
#import "../../Core/Utils/SPConstants.h"
#import "../../ViewModels/Game/SPGameViewModel.h"

NS_ASSUME_NONNULL_BEGIN

/**
 * 德州扑克游戏主场景
 * 负责游戏的视觉呈现和用户交互
 */
@interface SPGameScene : BaseSKScene <SPGameManagerDelegate>

#pragma mark - 游戏管理器

/// 游戏管理器
@property (nonatomic, strong, nullable) SPGameManager *gameManager;

/// 游戏ViewModel
@property (nonatomic, strong, nullable) SPGameViewModel *gameViewModel;

#pragma mark - UI节点

/// 扑克桌节点
@property (nonatomic, strong, readonly) SKShapeNode *pokerTable;

/// 公共牌区域
@property (nonatomic, strong, readonly) SKNode *communityCardsNode;

/// 玩家区域节点数组
@property (nonatomic, strong, readwrite) NSMutableArray<SKNode *> *playerNodes;

/// 底池显示标签
@property (nonatomic, strong, readonly) SKLabelNode *potLabel;

/// 游戏状态标签
@property (nonatomic, strong, readonly) SKLabelNode *gameStateLabel;

/// 轮次显示标签
@property (nonatomic, strong, readwrite) SKLabelNode *roundLabel;

/// 玩家操作按钮区域
@property (nonatomic, strong, readonly) SKNode *actionButtonsNode;

#pragma mark - 游戏初始化

/**
 * 初始化游戏场景
 * @param size 场景大小
 * @param gameManager 游戏管理器
 * @return 游戏场景实例
 */
- (instancetype)initWithSize:(CGSize)size gameManager:(SPGameManager *)gameManager;

/**
 * 开始新游戏
 */
- (void)startNewGame;

#pragma mark - 动画方法

/**
 * 发牌动画
 * @param cards 要发的牌
 * @param toPosition 目标位置
 * @param completion 完成回调
 */
- (void)dealCards:(NSArray<SPCard *> *)cards 
       toPosition:(CGPoint)toPosition 
       completion:(void(^)(void))completion;

/**
 * 筹码移动动画
 * @param amount 筹码数量
 * @param fromPosition 起始位置
 * @param toPosition 目标位置
 * @param completion 完成回调
 */
- (void)moveChips:(NSInteger)amount 
     fromPosition:(CGPoint)fromPosition 
       toPosition:(CGPoint)toPosition 
       completion:(void(^)(void))completion;

/**
 * 显示胜利动画
 * @param winnerPosition 获胜者位置
 * @param winAmount 获胜金额
 */
- (void)showWinnerAnimation:(CGPoint)winnerPosition winAmount:(NSInteger)winAmount;

/**
 * 更新公共牌显示
 * @param cards 公共牌
 * @param round 当前轮次
 */
- (void)updateCommunityCards:(NSArray<SPCard *> *)cards round:(SPGameState)round;

/**
 * 更新玩家状态显示
 * @param player 玩家
 * @param position 位置
 */
- (void)updatePlayerDisplay:(SPPlayer *)player atPosition:(NSInteger)position;

/**
 * 更新底池显示
 * @param amount 底池金额
 */
- (void)updatePotDisplay:(NSInteger)amount;

/**
 * 更新游戏状态显示
 * @param state 游戏状态
 */
- (void)updateGameStateDisplay:(SPGameState)state;

/**
 * 更新轮次显示
 * @param round 当前轮次
 */
- (void)updateRoundDisplay:(NSInteger)round;

/**
 * 显示游戏结果弹出框
 * @param winner 获胜者
 * @param players 所有玩家
 * @param winningHand 获胜牌型
 */
- (void)showGameResultPopup:(SPPlayer *)winner 
                  allPlayers:(NSArray<SPPlayer *> *)players 
                  winningHand:(SPHandResult *)winningHand;

/**
 * 关闭游戏结果弹出框
 */
- (void)closeGameResultPopup;

#pragma mark - 用户交互

/**
 * 创建玩家操作按钮
 */
- (void)createActionButtons;

/**
 * 更新操作按钮状态
 */
- (void)updateActionButtons;

/**
 * 处理玩家操作
 * @param action 操作类型
 * @param amount 操作金额（可选）
 */
- (void)handlePlayerAction:(SPPlayerAction)action amount:(NSInteger)amount;

@end

NS_ASSUME_NONNULL_END